package com.juc.aqs;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author : Zan
 * @Create : 2024/5/14 17:28
 * @ClassName : AQSDemo
 * @Description : TODO 请用一句话描述该类的功能
 */
public class AQSDemo {
    public static void main(String[] args) {
        ReentrantLock lock = new ReentrantLock(); // 非公平锁

        // A B C 三个顾客，去银行办理业务，A先到，此时窗口空无一人，优先获得办理窗口的机会，办理业务
        // A 耗时严重，估计长期占有窗口
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(" --- come in A");
                try {
                    TimeUnit.MINUTES.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                lock.unlock();
            }
        }, "A").start();

        // B 是第二个顾客，B一看到受理窗口被A占用，只能去候客区等待，进入AQS队列，等待着A办理完成，尝试去抢占受理窗口
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(" --- come in B");
            } finally {
                lock.unlock();
            }
        }, "B").start();

        // C 是第二个顾客，C一看到受理窗口被A占用，只能去候客区等待，进入AQS队列，等待着A办理完成，尝试去抢占受理窗口，前面是B顾客，FIFO原则
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(" --- come in C");
            } finally {
                lock.unlock();
            }
        }, "C").start();
    }
}
